package small.common.core.util;

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;

/**
 * 内存使用情况
 * @author jinzhou
 * @data 2023/5/11 13:59
 */
public class MemoryUtil {
    /**
     * 内存管理
     */
    static MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
    /**
     * 堆内存
     */
    static MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
    /**
     * 非堆内存
     */
    static MemoryUsage noHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();

    /**
     * 堆内存使用容量
     * @return
     */
    public static long heapMemoryUsed() {
        return heapMemoryUsage.getUsed();
    }

    /**
     * 堆内存最大容量
     * @return
     */
    public static long heapMemoryMax() {
        return heapMemoryUsage.getMax();
    }

    /**
     * 堆内存空闲容量
      * @return
     */
    public static long heapMemoryFree() {
        return Math.subtractExact(heapMemoryMax(), heapMemoryUsed());
    }


    /**
     * 非堆内存使用容量
     *
     * @return long bytes
     */
    public static long noHeapMemoryUsed() {
        return noHeapMemoryUsage.getUsed();
    }

    /**
     * 非堆内存最大容量
     *
     * @return long bytes
     */
    public static long noHeapMemoryMax() {
        return noHeapMemoryUsage.getMax();
    }

    /**
     * 非堆内存空闲容量
     *
     * @return long bytes
     */
    public static long noHeapMemoryFree() {
        return Math.subtractExact(noHeapMemoryMax(), noHeapMemoryUsed());
    }

}
